package com.xq.xq.kotlinlearnsingletom.java;

/**
 * @author jltxseo
 * Created by junlintianxia on 2019/11/29.
 * 实现单例访问，标准懒汉式方法 这个写法我们把四点需求从上往下检测，
 * 发现第二点的时候就出了问题，假设这样的场景：两个线程并发调用SingletonB
 * .getInstance()，假设线程一先判断完instance是否为null，既代码中的line A进入到line
 * B的位置。刚刚判断完毕后，JVM将CPU资源切换给线程二，由于线程一还没执行line B，所以instance仍然是空的，因此线程二执行了new
 * SingletonB()操作。片刻之后，线程一被重新唤醒，它执行的仍然是new
 * SingletonB()操作，好了，问题来了，两个SingletonB谁是李逵谁是李鬼？
 */
public class SingletonB {

    /**
     * 单例对象实例
     */
    private static SingletonB instance = null;

    private SingletonB() {

    }

    public static SingletonB getInstance() {
        if (instance == null) { // line A
            instance = new SingletonB(); // line B
        }
        return instance;
    }

    @Override
    public String toString() {
        return "SingletonB";
    }
}
